package org.smoozik.app.common.partition.component;

import java.awt.Graphics;

import org.smoozik.app.common.partition.PartitionValues;
import org.smoozik.app.ihm.Constants;
import org.smoozik.services.musictheory.Note;
import org.smoozik.services.musictheory.Token;

@SuppressWarnings("serial")
public class UINote extends UIMusicComponent {

	int absoluteHauteur;
	boolean writeRythmBars;

	public UINote(Token t) {
		super(t);
		writeRythmBars = true;
	}

	public UINote(Note note, UIPartition partition) {
		this(new Token(note));
		this.partition = partition;
	}

	public boolean isWriteRythmBars() {
		return writeRythmBars;
	}

	public void setWriteRythmBars(boolean writeRythmBars) {
		this.writeRythmBars = writeRythmBars;
	}

	public int getAbsoluteHauteur() {
		Note note = (Note) token.getFigure();
		int h = 0;
		h = partition.getHeight();
		h += partition.getCHeight() * PartitionValues.getWidth() / 2;

		h -= note.getIndexNote() * PartitionValues.getWidth() / 2;

		return h;
	}

	public void paint(Graphics g) {
		absoluteHauteur = getAbsoluteHauteur();

		if (token.getDuration() >= 2) {
			// g.drawImage(Constants.blancheImg, x, absoluteHauteur, null);
			g.drawOval(x - 2, absoluteHauteur ,
					PartitionValues.getWidth() + 2,
					PartitionValues.getWidth());
		} else {
			// g.drawImage(Constants.noteImg, x, absoluteHauteur, null);
			g.fillOval(x - 2, absoluteHauteur ,
					PartitionValues.getWidth() + 2,
					PartitionValues.getWidth());
		}

		int yBar = absoluteHauteur + PartitionValues.getWidth() / 2;

		// point
		if (token.getDuration() == 3 || token.getDuration() == 1.5
				|| token.getDuration() == 0.75) {
			g.fillRect(x + PartitionValues.getWidth() + 2, yBar, 4, 4);
		}

		// rythmBars
		writeRythmBars(g);

		paintBarrs(g);
		paintFlatSharp(g);
		circle(g);
		// label = token.getDecomposedDurationLabel();
		paintLabel(g, 10);
	}

	public void writeRythmBars(Graphics g) {
		if (writeRythmBars) {
			int xBar = x + PartitionValues.getWidth();
			int yBar = absoluteHauteur + PartitionValues.getWidth() / 2;
			height = 3 * PartitionValues.getWidth();
			y = yBar - height;

			// if (token.getDuration() == 0.25) {
			// g.drawLine(xBar, y, xBar + PartitionValues.getWidth() / 2,
			// y + PartitionValues.getWidth() / 4);
			// g.drawLine(
			// xBar,
			// y + PartitionValues.getWidth() / 2,
			// xBar + PartitionValues.getWidth() / 2,
			// y + PartitionValues.getWidth() / 2
			// + PartitionValues.getWidth() / 4);
			// }
			//
			// if (token.getDuration() == 0.5 || token.getDuration() == 0.75) {
			// g.drawLine(xBar, y, xBar + PartitionValues.getWidth() / 2,
			// y + PartitionValues.getWidth() / 4);
			// }

			if (token.getDuration() < 4) {
				g.drawLine(xBar, yBar, xBar, y);
			}
		}
	}

	public void paintBarrs(Graphics g) {
		int partHeight = partition.getHeight();
		int hauteurBarreUp = partHeight - PartitionValues.getWidth();
		int hauteurBarreDown = partHeight + 5 * PartitionValues.getWidth();
		int displayBarStart = x - PartitionValues.getWidth() / 2 ;
		int displayBarEnd = x + 3 * PartitionValues.getWidth() / 2 ;
		int tempHauteurBarre = hauteurBarreUp;
		int diffUp = partHeight - PartitionValues.getWidth() - absoluteHauteur;
		int diffDown = partHeight + 4 * PartitionValues.getWidth()
				- absoluteHauteur;
		int tempDiff = diffUp;

		while (tempDiff > 0) {
			g.drawLine(displayBarStart, tempHauteurBarre, displayBarEnd,
					tempHauteurBarre);
			tempHauteurBarre -= PartitionValues.getWidth();
			tempDiff -= PartitionValues.getWidth();
		}

		tempDiff = diffDown;
		tempHauteurBarre = hauteurBarreDown;
		while (tempDiff < 0) {
			g.drawLine(displayBarStart, tempHauteurBarre, displayBarEnd,
					tempHauteurBarre);
			tempHauteurBarre += PartitionValues.getWidth();
			tempDiff += PartitionValues.getWidth();
		}
	}

	public void paintFlatSharp(Graphics g) {
		Note note = (Note) getFigure();
		int dieseBemol = note.getHauteur() - note.getHauteurNonalteree();
		int i = dieseBemol;

		// g.setColor(Color.RED);
		// sharp painting
		while (i > 0) {
			g.drawImage(Constants.sharpImg, x - (17 * i), absoluteHauteur, null);
			// g.fillOval(displayMargin - (15 * i), absoluteHauteur, 8, 8);
			i--;
		}
		// g.setColor(Color.BLUE);
		// bemol painting
		while (i < 0) {
			g.drawImage(Constants.flatImg, x + (17 * i), absoluteHauteur, null);
			// g.fillOval(displayMargin + (15 * i), absoluteHauteur, 8, 8);
			i++;
		}
	}

}
